summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2014-07-01 16:04:59 +0200
committerantirez <antirez@gmail.com>2014-07-01 16:07:13 +0200
commit551bee86b42e7c41c9cd550795685eb20b207b88 (patch)
tree1eafccb38061e9a5fcf5a4384b33290315d8dc61
parent8612e6de888fe30bd8cfcd0f4ad1979a92434a2f (diff)
downloadredis-551bee86b42e7c41c9cd550795685eb20b207b88.tar.gz
LATENCY SAMPLES implemented.
-rw-r--r--src/latency.c44
-rw-r--r--src/redis.c3
-rw-r--r--src/redis.h1
3 files changed, 47 insertions, 1 deletions
diff --git a/src/latency.c b/src/latency.c
index 582906edc..bb05e8e71 100644
--- a/src/latency.c
+++ b/src/latency.c
@@ -89,5 +89,49 @@ void latencyAddSample(char *event, mstime_t latency) {
/* ---------------------- Latency command implementation -------------------- */
+/* latencyCommand() helper to produce a time-delay reply for all the samples
+ * in memory for the specified time series. */
+void latencyCommandReplyWithSamples(redisClient *c, struct latencyTimeSeries *ts) {
+ void *replylen = addDeferredMultiBulkLength(c);
+ int samples = 0, j;
+
+ for (j = 0; j < LATENCY_TS_LEN; j++) {
+ int i = (ts->idx + j) % LATENCY_TS_LEN;
+
+ if (ts->samples[i].time == 0) continue;
+ addReplyMultiBulkLen(c,2);
+ addReplyLongLong(c,ts->samples[i].time);
+ addReplyLongLong(c,ts->samples[i].latency);
+ samples++;
+ }
+ setDeferredMultiBulkLength(c,replylen,samples);
+}
+
+/* LATENCY command implementations.
+ *
+ * LATENCY SAMPLES: return time-latency samples for the specified event.
+ * LATENCY LATEST: return the latest latency for all the events classes.
+ * LATENCY DOCTOR: returns an human readable analysis of instance latency.
+ * LATENCY GRAPH: provide an ASCII graph of the latency of the specified event.
+ */
void latencyCommand(redisClient *c) {
+ struct latencyTimeSeries *ts;
+
+ if (!strcasecmp(c->argv[1]->ptr,"samples") && c->argc == 3) {
+ /* LATENCY SAMPLES <event> */
+ ts = dictFetchValue(server.latency_events,c->argv[2]->ptr);
+ if (ts == NULL) goto nodataerr;
+ latencyCommandReplyWithSamples(c,ts);
+ } else {
+ addReply(c,shared.syntaxerr);
+ return;
+ }
+ return;
+
+nodataerr:
+ /* Common error when the user asks for an event we have no latency
+ * information about. */
+ addReplyErrorFormat(c,
+ "No samples available for event '%s'", c->argv[2]->ptr);
}
+
diff --git a/src/redis.c b/src/redis.c
index 26e2295cb..a520bd75b 100644
--- a/src/redis.c
+++ b/src/redis.c
@@ -282,7 +282,8 @@ struct redisCommand redisCommandTable[] = {
{"pfadd",pfaddCommand,-2,"wmF",0,NULL,1,1,1,0,0},
{"pfcount",pfcountCommand,-2,"w",0,NULL,1,1,1,0,0},
{"pfmerge",pfmergeCommand,-2,"wm",0,NULL,1,-1,1,0,0},
- {"pfdebug",pfdebugCommand,-3,"w",0,NULL,0,0,0,0,0}
+ {"pfdebug",pfdebugCommand,-3,"w",0,NULL,0,0,0,0,0},
+ {"latency",latencyCommand,-2,"arslt",0,NULL,0,0,0,0,0}
};
struct evictionPoolEntry *evictionPoolAlloc(void);
diff --git a/src/redis.h b/src/redis.h
index 1d33e5594..17970bc41 100644
--- a/src/redis.h
+++ b/src/redis.h
@@ -1487,6 +1487,7 @@ void pfaddCommand(redisClient *c);
void pfcountCommand(redisClient *c);
void pfmergeCommand(redisClient *c);
void pfdebugCommand(redisClient *c);
+void latencyCommand(redisClient *c);
#if defined(__GNUC__)
void *calloc(size_t count, size_t size) __attribute__ ((deprecated));