Skip to content

Commit f3c413f

Browse files
authored
Merge 8f3bcc8 into 65d431f
2 parents 65d431f + 8f3bcc8 commit f3c413f

8 files changed

Lines changed: 216 additions & 1 deletion

File tree

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

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,53 @@ public Map<String, CommandInfo> build(Object data) {
997997
}
998998
};
999999

1000+
public static final Builder<Map<String, LatencyLatestInfo>> LATENCY_LATEST_RESPONSE = new Builder<Map<String, LatencyLatestInfo>>() {
1001+
@Override
1002+
public Map<String, LatencyLatestInfo> build(Object data) {
1003+
if (data == null) {
1004+
return null;
1005+
}
1006+
1007+
List<Object> rawList = (List<Object>) data;
1008+
Map<String, LatencyLatestInfo> map = new HashMap<>(rawList.size());
1009+
1010+
for (Object rawLatencyLatestInfo : rawList) {
1011+
if (rawLatencyLatestInfo == null) {
1012+
continue;
1013+
}
1014+
1015+
LatencyLatestInfo latestInfo = LatencyLatestInfo.LATENCY_LATEST_BUILDER.build(rawLatencyLatestInfo);
1016+
String name = latestInfo.getCommand();
1017+
map.put(name, latestInfo);
1018+
}
1019+
1020+
return map;
1021+
}
1022+
};
1023+
1024+
public static final Builder<List<LatencyHistoryInfo>> LATENCY_HISTORY_RESPONSE = new Builder<List<LatencyHistoryInfo>>() {
1025+
@Override
1026+
public List<LatencyHistoryInfo> build(Object data) {
1027+
if (data == null) {
1028+
return null;
1029+
}
1030+
1031+
List<Object> rawList = (List<Object>) data;
1032+
List<LatencyHistoryInfo> response = new ArrayList<>(rawList.size());
1033+
1034+
for (Object rawLatencyHistoryInfo : rawList) {
1035+
if (rawLatencyHistoryInfo == null) {
1036+
continue;
1037+
}
1038+
1039+
LatencyHistoryInfo historyInfo = LatencyHistoryInfo.LATENCY_HISTORY_BUILDER.build(rawLatencyHistoryInfo);
1040+
response.add(historyInfo);
1041+
}
1042+
1043+
return response;
1044+
}
1045+
};
1046+
10001047
private static final Builder<List<List<Long>>> CLUSTER_SHARD_SLOTS_RANGES = new Builder<List<List<Long>>>() {
10011048

10021049
@Override

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.Map.Entry;
1515
import java.util.Set;
1616
import java.util.stream.Collectors;
17+
import java.util.Arrays;
1718

1819
import javax.net.ssl.HostnameVerifier;
1920
import javax.net.ssl.SSLParameters;
@@ -9280,6 +9281,26 @@ public String latencyDoctor() {
92809281
return connection.getBulkReply();
92819282
}
92829283

9284+
public Map<String, LatencyLatestInfo> latencyLatest() {
9285+
checkIsInMultiOrPipeline();
9286+
connection.sendCommand(LATENCY, LATEST);
9287+
return BuilderFactory.LATENCY_LATEST_RESPONSE.build(connection.getOne());
9288+
}
9289+
9290+
public List<LatencyHistoryInfo> latencyHistory(LatencyEvent event) {
9291+
checkIsInMultiOrPipeline();
9292+
connection.sendCommand(new CommandArguments(LATENCY).add(HISTORY).add(event));
9293+
return BuilderFactory.LATENCY_HISTORY_RESPONSE.build(connection.getOne());
9294+
}
9295+
9296+
public long latencyReset(LatencyEvent... events) {
9297+
checkIsInMultiOrPipeline();
9298+
CommandArguments arguments = new CommandArguments(LATENCY).add(Keyword.RESET);
9299+
Arrays.stream(events).forEach(arguments::add);
9300+
connection.sendCommand(arguments);
9301+
return connection.getIntegerReply();
9302+
}
9303+
92839304
@Override
92849305
public StreamEntryID xadd(final String key, final StreamEntryID id, final Map<String, String> hash) {
92859306
checkIsInMultiOrPipeline();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ public static enum Keyword implements Rawable {
299299
REV, WITHCOORD, WITHDIST, WITHHASH, ANY, FROMMEMBER, FROMLONLAT, BYRADIUS, BYBOX, BYLEX, BYSCORE,
300300
STOREDIST, TO, FORCE, TIMEOUT, DB, UNLOAD, ABORT, IDX, MINMATCHLEN, WITHMATCHLEN, FULL,
301301
DELETE, LIBRARYNAME, WITHCODE, DESCRIPTION, GETKEYS, GETKEYSANDFLAGS, DOCS, FILTERBY, DUMP,
302-
MODULE, ACLCAT, PATTERN, DOCTOR, USAGE, SAMPLES, PURGE, STATS, LOADEX, CONFIG, ARGS, RANK,
302+
MODULE, ACLCAT, PATTERN, DOCTOR, LATEST, HISTORY, USAGE, SAMPLES, PURGE, STATS, LOADEX, CONFIG, ARGS, RANK,
303303
NOW, VERSION, ADDR, SKIPME, USER, LADDR,
304304
CHANNELS, NUMPAT, NUMSUB, SHARDCHANNELS, SHARDNUMSUB;
305305

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package redis.clients.jedis.args;
2+
3+
import redis.clients.jedis.util.SafeEncoder;
4+
5+
public enum LatencyEvent implements Rawable {
6+
7+
ACTIVE_DEFRAG_CYCLE("active-defrag-cycle"), AOF_FSYNC_ALWAYS("aof-fsync-always"), AOF_STAT("aof-stat"),
8+
AOF_REWRITE_DIFF_WRITE("aof-rewrite-diff-write"), AOF_RENAME("aof-rename"), AOF_WRITE("aof-write"),
9+
AOF_WRITE_ACTIVE_CHILD("aof-write-active-child"), AOF_WRITE_ALONE("aof-write-alone"),
10+
AOF_WRITE_PENDING_FSYNC("aof-write-pending-fsync"), COMMAND("command"), EXPIRE_CYCLE("expire-cycle"),
11+
EVICTION_CYCLE("eviction-cycle"), EVICTION_DEL("eviction-del"), FAST_COMMAND("fast-command"),
12+
FORK("fork"), RDB_UNLINK_TEMP_FILE("rdb-unlink-temp-file");
13+
14+
private final byte[] raw;
15+
16+
private LatencyEvent(String s) {
17+
raw = SafeEncoder.encode(s);
18+
}
19+
20+
@Override
21+
public byte[] getRaw() {
22+
return raw;
23+
}
24+
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
package redis.clients.jedis.commands;
22

33
import redis.clients.jedis.args.FlushMode;
4+
import redis.clients.jedis.args.LatencyEvent;
45
import redis.clients.jedis.args.SaveMode;
56
import redis.clients.jedis.exceptions.JedisException;
67
import redis.clients.jedis.params.LolwutParams;
78
import redis.clients.jedis.params.ShutdownParams;
9+
import redis.clients.jedis.resps.LatencyHistoryInfo;
10+
import redis.clients.jedis.resps.LatencyLatestInfo;
811
import redis.clients.jedis.util.KeyValue;
912

13+
import java.util.List;
14+
import java.util.Map;
15+
1016
public interface ServerCommands {
1117

1218
/**
@@ -246,4 +252,10 @@ default void shutdown(SaveMode saveMode) throws JedisException {
246252
* @return the report
247253
*/
248254
String latencyDoctor();
255+
256+
Map<String, LatencyLatestInfo> latencyLatest();
257+
258+
List<LatencyHistoryInfo> latencyHistory(LatencyEvent events);
259+
260+
long latencyReset(LatencyEvent... events);
249261
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package redis.clients.jedis.resps;
2+
3+
import redis.clients.jedis.Builder;
4+
5+
import java.util.List;
6+
7+
import static redis.clients.jedis.BuilderFactory.LONG;
8+
9+
public class LatencyHistoryInfo {
10+
11+
private final long timestamp;
12+
private final long latency;
13+
14+
public LatencyHistoryInfo(long timestamp, long latency) {
15+
this.timestamp = timestamp;
16+
this.latency = latency;
17+
}
18+
19+
public long getTimestamp() {
20+
return timestamp;
21+
}
22+
23+
public long getLatency() {
24+
return latency;
25+
}
26+
27+
public static final Builder<LatencyHistoryInfo> LATENCY_HISTORY_BUILDER = new Builder<LatencyHistoryInfo>() {
28+
@Override
29+
public LatencyHistoryInfo build(Object data) {
30+
List<Object> commandData = (List<Object>) data;
31+
32+
long timestamp = LONG.build(commandData.get(0));
33+
long latency = LONG.build(commandData.get(1));
34+
35+
return new LatencyHistoryInfo(timestamp, latency);
36+
}
37+
};
38+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package redis.clients.jedis.resps;
2+
3+
import redis.clients.jedis.Builder;
4+
5+
import java.util.List;
6+
7+
import static redis.clients.jedis.BuilderFactory.LONG;
8+
import static redis.clients.jedis.BuilderFactory.STRING;
9+
10+
public class LatencyLatestInfo {
11+
12+
private final String command;
13+
private final long timestamp;
14+
private final long lastEventLatency;
15+
private final long maxEventLatency;
16+
17+
public LatencyLatestInfo(String command, long timestamp, long lastEventLatency, long maxEventLatency) {
18+
this.command = command;
19+
this.timestamp = timestamp;
20+
this.lastEventLatency = lastEventLatency;
21+
this.maxEventLatency = maxEventLatency;
22+
}
23+
24+
public String getCommand() {
25+
return command;
26+
}
27+
28+
public long getTimestamp() {
29+
return timestamp;
30+
}
31+
32+
public long getLastEventLatency() {
33+
return lastEventLatency;
34+
}
35+
36+
public long getMaxEventLatency() {
37+
return maxEventLatency;
38+
}
39+
40+
public static final Builder<LatencyLatestInfo> LATENCY_LATEST_BUILDER = new Builder<LatencyLatestInfo>() {
41+
@Override
42+
public LatencyLatestInfo build(Object data) {
43+
List<Object> commandData = (List<Object>) data;
44+
45+
String command = STRING.build(commandData.get(0));
46+
long timestamp = LONG.build(commandData.get(1));
47+
long lastEventLatency = LONG.build(commandData.get(2));
48+
long maxEventLatency = LONG.build(commandData.get(3));
49+
50+
return new LatencyLatestInfo(command, timestamp, lastEventLatency, maxEventLatency);
51+
}
52+
};
53+
}

src/test/java/redis/clients/jedis/commands/jedis/ControlCommandsTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,15 @@
3030
import redis.clients.jedis.JedisMonitor;
3131
import redis.clients.jedis.Protocol;
3232
import redis.clients.jedis.args.ClientPauseMode;
33+
import redis.clients.jedis.args.LatencyEvent;
3334
import redis.clients.jedis.exceptions.JedisDataException;
3435
import redis.clients.jedis.HostAndPorts;
3536
import redis.clients.jedis.params.CommandListFilterByParams;
3637
import redis.clients.jedis.params.LolwutParams;
3738
import redis.clients.jedis.resps.CommandDocument;
3839
import redis.clients.jedis.resps.CommandInfo;
40+
import redis.clients.jedis.resps.LatencyHistoryInfo;
41+
import redis.clients.jedis.resps.LatencyLatestInfo;
3942
import redis.clients.jedis.util.AssertUtil;
4043
import redis.clients.jedis.util.KeyValue;
4144
import redis.clients.jedis.util.SafeEncoder;
@@ -440,6 +443,23 @@ public void latencyDoctor() {
440443
assertNotNull(report);
441444
}
442445

446+
@Test
447+
public void latencyLatest() {
448+
Map<String, LatencyLatestInfo> report = jedis.latencyLatest();
449+
assertNotNull(report);
450+
}
451+
452+
@Test
453+
public void latencyHistoryFork() {
454+
List<LatencyHistoryInfo> report = jedis.latencyHistory(LatencyEvent.FORK);
455+
assertNotNull(report);
456+
}
457+
458+
@Test
459+
public void latencyReset() {
460+
assertTrue(jedis.latencyReset() >= 0);
461+
}
462+
443463
@Test
444464
public void commandCount() {
445465
assertTrue(jedis.commandCount() > 100);

0 commit comments

Comments
 (0)